﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDelegateTeach
{
    /// <summary>
    /// 一：委托
    /// 1.为什么要用委托？
    /// 【1】事件  【2】多线程  【3】对象之间的逆向调用（传值）  
    ///  逆向调用：A类（aa方法） B类（bb方法）
    ///  A中创建一个B对象，去调用B中的bb方法。
    ///  特殊需求：B中也想调用A中的aa方法。（不能直接调用）用委托来解决！
    ///  
    /// 
    /// 2.委托的概念
    /// 通俗化理解：委托其实本质就是用来代表一个或多个方法的。委托其实规定的是方法的”原型“
    /// 定义符合要求的方法，那委托变量就可以去代表这些方法。也就意味着，我们以前是直接调用方法，现在改成使用：委托变量来调用
    /// 
    /// 方法原型：规定了方法的返回值类型、方法参数类型、和个数
    /// 
    /// 张某----》朋友------》领导
    /// 
    /// B类----》委托------》A类（aa方法）
    /// 
    /// 
    /// 3.委托使用基本步骤
    /// 【1】声明委托类型（定义方法的原型），一般委托都要声明在类的外面，委托本身也是一种特殊的数据类型（引用）
    /// 【2】编写具体方法（符合方法的原型）
    /// 【3】创建委托变量
    /// 【4】关联委托方法（将某一个或多个具体的方法和委托变量关联
    /// 【5】使用委托变量（调用所关联的方法）
    /// 
    /// 多路委托：一个委托变量关联了若干方法，当调用委托变量的时候，所关联的方法会按照关联的顺序依次执行
    /// 
    /// 
    /// 
    /// 委托是方法的变量，能够代表一个或多个同类型方法的变量
    /// 
    /// 
    /// </summary>
    internal class Program
    {
        static void Main(string[] args)
        {
            //【3】创建委托变量
            StudyDelegate myStudyDelegate = null;
            //StudyDelegate myStudyDelegate = new StudyDelegate(MyStudy1);

            //【4】关联委托方法

            
            myStudyDelegate = MyStudy1;

            //【5】使用委托变量
            myStudyDelegate();

            Console.WriteLine("----------------------");

            //多路委托
            myStudyDelegate += MyStudy2;
            myStudyDelegate();

            Console.WriteLine("----------------------");

            myStudyDelegate += MyStudy3;
            myStudyDelegate();

            Console.WriteLine("----------------------");

            //断开关联
            myStudyDelegate -= MyStudy2;
            myStudyDelegate();

            Console.ReadLine();
        }

        //【2】方法编写
        static void MyStudy1()
        {
            Console.WriteLine("我正在学习Csharp上位机");
        }

        static void MyStudy2()
        {
            Console.WriteLine("我正在学习运动控制上位机");
        }

        static void MyStudy3()
        {
            Console.WriteLine("我正在学习视觉上位机");
        }
    }


    //【1】声明委托
    public delegate void StudyDelegate();
}
